package cn.it.shop.service.impl;

import java.util.HashMap;
import java.util.List;

import org.springframework.stereotype.Service;

import antlr.StringUtils;
import cn.it.shop.model.Category;
import cn.it.shop.service.CategoryService;

@SuppressWarnings("unchecked")
@Service("categoryService")
public class CategoryServiceImpl extends BaseServiceImpl<Category> implements
		CategoryService {

	
	
	/*
	 * 03-08 2  hibernate中的分页很简单，只需要调用两个方法setFirstResult和setMaxResults
	 */
	

	/*
	 * 03-08-1
	 * .可能大家会想到将fetch设置生FetchType.LAZY就不会发多条语句了，但是这肯定不行，因为设置成LAZY后，
	 * 我们就拿不到Account对象了，比较好的解决方法是我们自己写hql语句，使用join fetch
	 */
	@Override
	public List<Category> queryJoinAccount(String type,int page, int size) {
		
        String hql = "from Category c left join fetch c.account where c.type like :type";  
        return getSession().createQuery(hql)  
                .setString("type", "%" + type + "%")
                .setFirstResult((page-1) * size) //从第几个开始显示  
                .setMaxResults(size) //显示几个  
                .list();    
	}

	@Override
	public Long getCount(String type) {
		String hql = "select count(c) from Category c where c.type like:type";
        return (Long) getSession().createQuery(hql)  
                .setString("type", "%" + type + "%")  
                .uniqueResult(); //返回一条记录:总记录数  
	}

	@Override
	public void deleteByIds(String ids) {
		String hql = "delete from Category c where c.id in ("+ids+")";
		getSession().createQuery(hql).executeUpdate();
		
	}

	
    @Override  
    public List<Category> queryByHot(boolean hot) {  
        String hql = "from Category c where c.hot=:hot";  
        return getSession().createQuery(hql)  
            .setBoolean("hot", hot)  
            .list();  
    }  
	
	/*
	 * 只要添加CategoryService本身需要的新的方法即可，公共方法已经在BaseService中了
	 * 
	 * 但是别忘了很重要的一点：就是修改Spring的配置文件beans.xml中的bean。
	 * 
	 * <bean id="categoryService"
	 * class="cn.it.shop.service.impl.CategoryServiceImpl"
	 * parent="baseService"/>
	 */

	// /*Spring和Hibernate整个后*/
	// private SessionFactory sessionFactory; //定义一个sessionFactory
	//
	// //当需要使用sessoinFactory的时候，Spring会将sessionFactory注入进来
	// public void setSessionFactory(SessionFactory sessionFactory) {
	// this.sessionFactory = sessionFactory;
	// }
	// protected Session getSession() {
	// //从当前线程获取session，如果没有则创建一个新的session
	// return sessionFactory.getCurrentSession();
	// }

	// @Override //没有和Spring整合的情况
	// public void save(Category category) {
	// //通过刚刚生成的sessionFactory获取session
	// Session session = HibernateSessionFactory.getSession();
	// try {
	// //手动事务
	// session.getTransaction().begin();
	// //执行业务逻辑
	// session.save(category);
	// //手动提交
	// session.getTransaction().commit();
	// } catch(Exception e) {
	// session.getTransaction().rollback();
	// throw new RuntimeException(e);
	// } finally {
	// HibernateSessionFactory.closeSession();
	// }
	// }

	/*
	 * 写好后抽取到BaseServiceImpl中
	 */

	// @Override
	// public void save(Category category) {
	// getSession().save(category);
	// }
	//
	// @Override
	// public void update(Category category) {
	// getSession().update(category);
	// }
	//
	// @Override
	// public void delete(int id) {
	// /*第一种方法有个弊端，就是没删除一次得先查询一次
	// Object obj = getSession().get(Category.class, id);
	// if(obj != null) {
	// getSession().delete(obj);
	// }*/
	// String hql = "delete Category while id=:id";
	// getSession().createQuery(hql) //
	// .setInteger("id", id) //
	// .executeUpdate();
	// }
	//
	// @Override
	// public Category get(int id) {
	// return (Category) getSession().get(Category.class, id);
	// }
	//
	// @Override
	// public List<Category> query() {
	// String hql = "from Category";
	// return getSession().createQuery(hql).list();
	// }
}
